// Package chat
// @Author: zhangdi
// @File: gpt.go
// @Version: 1.0.0
// @Date: 2023/5/31 16:37
package chat

import (
	openai "github.com/sashabaranov/go-openai"
	"net/http"
	"net/url"
	"os"
	"strings"
)

type CompletionMessage = openai.ChatCompletionMessage
type (
	IGpt interface {
		InitGpt(config *GptConfig) error

		SendContents(contents []CompletionMessage) (string, error)

		//GetStream(content string, StreamNotify StreamHandler)

		// UpdateConfig 更新key
		UpdateConfig(newConfig *GptConfig) error

		// GetCurrKey 获取当前的key
		GetCurrKey() string
	}
)

type GptConfig struct {
	OpenAiKey         string
	IdeaToolKey       string
	ProxyType         string // 代理服务api
	ProxyServerUrl    string // 代理服务api
	ProxyLocalUrl     string // 127.0.0.1
	GptModel          string // gpt使用的模型
	IsStream          bool
	StreamHandle      StreamHandler
	BackAuthorization string
}

// StreamHandler 回调函数
type StreamHandler func(text string, isEnd bool, isError bool)

// 定义哪些类要实现这个接口
var _ IGpt = &GptLocal{}

//var _ IGpt = &GptServer{}

func SetLocalProxy(proxyLocalUrl string) error {
	proxyLocalUrl = strings.TrimSpace(proxyLocalUrl)
	if proxyLocalUrl == "" {
		proxyLocalUrl = "http://127.0.0.1:10809"
	}
	//return nil
	proxyURL, err := url.Parse(proxyLocalUrl)
	if err != nil {
		return err
	}
	http.DefaultTransport = &http.Transport{Proxy: http.ProxyURL(proxyURL)}
	os.Setenv("HTTP_PROXY", proxyLocalUrl)
	os.Setenv("HTTPS_PROXY", proxyLocalUrl)
	return nil
}

// ResetLocalProxy 取消代理，处理完成后
func ResetLocalProxy() {
	http.DefaultTransport.(*http.Transport).Proxy = nil
	os.Unsetenv("HTTP_PROXY")
	os.Unsetenv("HTTPS_PROXY")
}

//var GptModelsCompleteText []string = []string{enums.GPTModelBabbage001, enums.GPTModelCurie001, enums.GPTModelAda001, enums.GPTModelDavinci003, enums.GPTModelDavinci002}

// ModelIsCompleteChat 检测一个模型是否为 /v1/chat/completions接口支持的模型
func ModelIsCompleteChat(gptModel string) bool {
	// GptModelsCompleteText 以下模型不支持上下文
	//if utils.ArrContains(GptModelsCompleteText, gptModel) {
	//	// 当前模型属于/v1/completions接口	不使用上下文
	//	return false
	//}

	return true
}
